package common

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	amqp "github.com/rabbitmq/amqp091-go"
	"gochat/models"
	"gochat/utils/rabbitmq"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"time"
)

var (
	DB          *gorm.DB
	RDB         *redis.Client
	RabbitPools *rabbitmq.ConnectionPool
)

func InitSystem() error {
	InitRabbitMQ()
	err := InitDB()
	if err != nil {
		return err
	}
	err = InitRDB()
	if err != nil {
		return err
	}
	return err
}

func InitRabbitExchange() error {
	// 连接RabbitMQ服务器
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	if err != nil {
		return nil
	}
	defer conn.Close()
	// 创建通道
	ch, err := conn.Channel()
	defer ch.Close()
	// 声明topic类型的交换机
	err = ch.ExchangeDeclare(
		"message.group", // 交换机名称
		"topic",         // 交换机类型
		true,            // 是否持久化
		false,           // 是否自动删除
		false,           // 是否内部使用
		false,           // 是否阻塞
		nil,             // 额外参数
	)

	return err
}
func InitRabbitMQ() {
	pool := rabbitmq.NewConnectionPool(10)
	log.Println(logger.Green, "RabbitMQ初始化成功")
	RabbitPools = pool
}
func InitDB() error {
	// 使用 SQLite 驱动打开数据库文件（如果不存在会自动创建）
	db, err := gorm.Open(sqlite.Open("./sql/database.db"), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info), // 日志级别设置为 Info
	})
	if err != nil {
		return err
	}

	// 自动迁移模型（创建或更新表结构）
	err = db.AutoMigrate(
		&models.UserBasic{},
		&models.Message{},
		&models.GroupModel{},
		&models.UserGroup{},
		&models.FriendRequest{},
		&models.UserFriends{},
	)
	if err != nil {
		return err
	}

	// 设置连接池（可选）
	sqlDB, err := db.DB()
	if err != nil {
		return err
	}

	// SQLite 不支持太多连接，设置较小的连接池
	sqlDB.SetMaxIdleConns(10)
	sqlDB.SetMaxOpenConns(100)
	sqlDB.SetConnMaxLifetime(time.Hour)

	DB = db
	return nil
}
func InitRDB() error {
	rdb := redis.NewClient(&redis.Options{
		Addr:     "127.0.0.1:6379",
		Password: "",
		DB:       0,
	})
	ctx := context.Background()
	pong, err := rdb.Ping(ctx).Result()
	if err != nil {
		return err
	}
	fmt.Println("连接 Redis 成功:", pong)
	RDB = rdb
	return nil

}
